Automated WCAG 2.1 AA a11y testing across all themes/modes - #38
Merged
Merged
Conversation
sjoerdbeentjes
force-pushed
the
feat/a11y-testing
branch
5 times, most recently
from
June 22, 2026 14:18
b563368 to
871c744
Compare
Contributor
♿ Accessibility audit — WCAG 2.2 AA⏭️ 37 story(ies) safe to skip in manual review — color-contrast only
@surfnet/curve-angular — 90 finding(s)Alert — 6 finding(s) · color-contrast only
Badge — 3 finding(s) · color-contrast onlyButton — 4 finding(s) · color-contrast onlyCalendar — 56 finding(s) · color-contrast only
DataTable — 1 finding(s) · color-contrast onlyEmpty — 2 finding(s) · color-contrast onlyItem — 1 finding(s) · color-contrast onlyPagination — 14 finding(s) · color-contrast only
Sidebar — 2 finding(s) · color-contrast only@surfnet/curve-react — 24 finding(s)Alert — 6 finding(s) · color-contrast only
Badge — 3 finding(s) · color-contrast onlyButton — 4 finding(s) · color-contrast onlyCalendar — 3 finding(s) · color-contrast onlyCard — 1 finding(s) · color-contrast onlyDataTable — 1 finding(s) · color-contrast onlyEmpty — 2 finding(s) · color-contrast onlyItem — 1 finding(s) · color-contrast onlySidebar — 2 finding(s) · color-contrast onlyAutomated axe covers ~30–50% of WCAG 2.2 AA. Keyboard, screen-reader and reflow checks still need a manual pass. Full per-story JSON is in the run’s |
sjoerdbeentjes
force-pushed
the
feat/a11y-testing
branch
from
June 23, 2026 07:28
65e29e3 to
70b2499
Compare
sjoerdbeentjes
force-pushed
the
feat/a11y-testing
branch
3 times, most recently
from
June 30, 2026 06:45
8b13cff to
fc78595
Compare
sjoerdbeentjes
force-pushed
the
feat/a11y-testing
branch
4 times, most recently
from
July 1, 2026 18:46
52bcb10 to
5afc87c
Compare
loofpc
reviewed
Jul 2, 2026
|
|
||
| # Scoped to @surfnet/storybook-config, which pins playwright, so both | ||
| # framework runs share one browser. | ||
| - name: Install Playwright Chromium |
Collaborator
There was a problem hiding this comment.
Hoe is de performance? Ik zou verwachten dat we in een CI-stap een headless browser gebruiken.
sjoerdbeentjes
force-pushed
the
feat/a11y-testing
branch
2 times, most recently
from
July 6, 2026 07:43
573772a to
4c66f62
Compare
sjoerdbeentjes
force-pushed
the
feat/a11y-testing
branch
from
July 6, 2026 14:18
2ff8134 to
d06f9c4
Compare
sjoerdbeentjes
force-pushed
the
feat/a11y-testing
branch
from
July 6, 2026 14:41
80cb843 to
35e6fa9
Compare
sjoerdbeentjes
force-pushed
the
feat/a11y-testing
branch
from
July 7, 2026 07:18
35e6fa9 to
6bad9d1
Compare
sjoerdbeentjes
force-pushed
the
feat/a11y-testing
branch
from
July 14, 2026 15:22
6bad9d1 to
bc7b4c3
Compare
sjoerdbeentjes
force-pushed
the
feat/a11y-testing
branch
from
August 25, 2026 08:05
bc7b4c3 to
191e282
Compare
anneke
force-pushed
the
feat/a11y-testing
branch
from
September 1, 2026 07:38
191e282 to
98fe989
Compare
anneke
force-pushed
the
feat/a11y-testing
branch
from
September 21, 2026 12:29
3cd4e58 to
a17d357
Compare
anneke
force-pushed
the
feat/a11y-testing
branch
from
September 21, 2026 14:36
01a62e4 to
512cdcf
Compare
The Default story rendered a bare switch with no visible label or aria-label, failing the aria-toggle-field-name a11y check. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Select's role="combobox" trigger does not take its name from visible content (name-from-author only per ARIA), so the placeholder/value text inside SelectValue was never exposed as an accessible name. Added aria-label to the trigger in each story. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
ComboboxChipRemove had no accessible name, unlike ComboboxClear which already defaults to "Clear". Added a removeLabel prop (default "Remove") and used a per-chip label in the Multiple story. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Base UI's ToggleGroup renders role="group" but also sets aria-orientation on the root, which isn't a valid attribute for that role per the ARIA spec (aria-allowed-attr). Unset it explicitly since data-orientation already drives the visual layout. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
react-resizable-panels always wraps panel content in an overflow:auto div. The Sidebar/Inspector panels were narrower than their unbreakable label text, creating a scrollable-but-unfocusable region (scrollable-region-focusable). Added min-w-0 + truncate so the content no longer overflows. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
_values fell back to [min, max] whenever value/defaultValue was a plain number instead of an array, so every single-value slider rendered a second, unlabeled ghost thumb alongside the real one. Fixed the fallback to a single-value array, and forwarded aria-label / getAriaLabel to each Slider.Thumb (a root-level aria-label doesn't reach the underlying range inputs). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The month/year select triggers use role="combobox", which takes its name from author (aria-label) only, not from content — so the visible "Sep"/"2026" text wasn't exposed as an accessible name. Added aria-label to both triggers. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Base UI's Root props don't include Thumb-only props like getAriaLabel, so it needs an explicit type extension for tsc to accept it being forwarded from Slider to Slider.Thumb. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
anneke
marked this pull request as ready for review
September 22, 2026 08:44
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
















































































































Adds an automated WCAG 2.1 AA pipeline that sweeps every Storybook story across all themes and modes from
@surfnet/tokens, in both React and Angular.What
@surfnet/storybook-config: browser-safea11yParameters(merged into both previews, also scopes the addon-a11y panel) and a node-onlyrunStoryA11yAuditbehind a./test-runnersubpath so it never enters a preview bundle.@storybook/test-runner+axe-playwrightagainst a served Storybook, so one setup covers React (Vite) and Angular (webpack). Each story is audited once per theme × mode (11 themes × 2 modes), writing a per-story JSON report.test:a11y/test:a11y:ciscripts, a turbo task, a root script, and a CI step that runs report-only (continue-on-error) and uploads the JSON as an artifact.Notes
continue-on-error.